import { ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
import { PUBLIC_KEY } from '../constants/decorator.constant';

/**
 * JWT认证守卫
 * 继承自 PassportJS 的 AuthGuard
 * 用于验证请求中的 JWT token
 */
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  /**
   * 构造函数
   * @param reflector - 用于获取路由元数据的工具类
   */
  constructor(private reflector: Reflector) {
    super();
  }

  /**
   * 判断是否需要进行身份验证
   * @param context - 执行上下文，包含请求信息
   * @returns {boolean} - true: 允许访问, false: 拒绝访问
   */
  canActivate(context: ExecutionContext) {
    // 获取路由上是否标记了 @Public() 装饰器
    // getAllAndOverride 会查找方法和类级别的装饰器
    const isPublic = this.reflector.getAllAndOverride<boolean>(PUBLIC_KEY, [
      context.getHandler(), // 获取方法级别的元数据
      context.getClass() // 获取类级别的元数据
    ]);
    console.log('jwt isPublic :>> ', isPublic);

    // 如果路由标记为公开，直接放行
    if (isPublic) {
      return true;
    }

    // 否则执行父类的 JWT 验证逻辑
    return super.canActivate(context);
  }
}
